﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Windows.Forms;

namespace GestionBudget.Objects
{
    public class Devise : ObjectPersistent
    {
        private const string NOM_FICHIER_XML = "devises.xml";
        private const string RACINE_XML = "Devises";

        private int identifiant;
        private string description;
        private string symbole;
        private decimal valeur;//Valeur donnée par rapport au dollar canadien


        private Devise()
        {
            description = "Description de la devise";
            SetEstNouveauTrue();
        }

        private Devise(string identifiant, string description, string symbole, string valeur)
        {
            this.identifiant = Convert.ToInt32(identifiant);
            this.description = description;
            this.symbole = symbole;
            this.valeur = Convert.ToDecimal(valeur);
        }

        public Devise Self
        {
            get { return this; }
        }

        public int Identifiant
        {
            get { return identifiant; }
        }

        public string Description
        {
            get { return (!string.IsNullOrEmpty(description) ? description : String.Empty); }
            set
            {
                if (identifiant != 1)
                {
                    if (value != description)
                    {
                        SetEstModifieTrue();
                    }
                    description = value;
                }
            }
        }

        public string DescriptionLongue
        {
            get { return description + symbole; }
        }

        public string Symbole
        {
            get { return (!string.IsNullOrEmpty(symbole) ? symbole : String.Empty); }
            set
            {
                if (identifiant != 1)
                {
                    if (value != symbole)
                    {
                        SetEstModifieTrue();
                    }

                    symbole = value;
                }
            }
        }

        public decimal Valeur
        {
            get { return valeur; }
            set
            {
                if (identifiant != 1)
                {
                    if (value != valeur)
                    {
                        SetEstModifieTrue();
                    }
                    valeur = value;
                }
            }
        }

        public static Devise Creer()
        {
            Devise nouvelleDevise = new Devise();
            DictionnaireDonnees.ListeDevises.Add(nouvelleDevise);
            nouvelleDevise.AttribuerIdentifiant();

            return nouvelleDevise;
        }

        public static Devise Creer(string description, string symbole, decimal valeur)
        {
            Devise nouvelleDevise = new Devise()
            {
                description = description,
                symbole = symbole,
                valeur = valeur
            };
            DictionnaireDonnees.ListeDevises.Add(nouvelleDevise);
            nouvelleDevise.AttribuerIdentifiant();

            return nouvelleDevise;
        }

        public override void AttribuerIdentifiant()
        {
            if (this.identifiant == 0)
            {
                this.identifiant = DictionnaireDonnees.ListeDevises.OrderBy(devise => devise.Identifiant).Last().Identifiant + 1;
            }
        }

        static public List<Devise> ChargerListe()
        {
            CreerFichier(NOM_FICHIER_XML, RACINE_XML);

            try
            {
                List<Devise> ListeDevises = new List<Devise>();
                XElement xelement = XElement.Load(NOM_FICHIER_XML);

                IEnumerable<XElement> transactions = xelement.Elements();

                foreach (var devise in transactions)
                {
                    Devise nouvelleDevise = new Devise(devise.Element("identifiant").Value,
                                                        devise.Element("description").Value,
                                                        devise.Element("symbole").Value,
                                                        devise.Element("valeur").Value);
                    ListeDevises.Add(nouvelleDevise);
                }

                return ListeDevises;
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors du chargement des devises; " + e.Message, "Attention", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return null;
            }
        }

        public override void Sauvegarder()
        {
            CreerFichier(NOM_FICHIER_XML, RACINE_XML);

            try
            {
                if (this.EstModifie || this.EstNouveau)
                {
                    XDocument xDocument = XDocument.Load(NOM_FICHIER_XML);

                    if (this.EstNouveau)
                    {
                        if (this.Identifiant == 0)
                        {
                            AttribuerIdentifiant();
                        }

                        xDocument.Root.Add(new XElement("Devise", new XElement("identifiant", this.identifiant.ToString()),
                                                                        new XElement("description", this.description),
                                                                        new XElement("symbole", this.symbole),
                                                                        new XElement("valeur", this.valeur.ToString())));
                    }
                    else if (this.EstModifie)
                    {
                        IEnumerable<XElement> devises = xDocument.Elements();
                        XElement elementDevise = (from devise in devises.Elements()
                                                  where devise.Element("identifiant").Value.Equals(this.identifiant.ToString())
                                                  select devise).First();
                        elementDevise.Element("description").Value = this.description;
                        elementDevise.Element("symbole").Value = this.symbole;
                        elementDevise.Element("valeur").Value = this.valeur.ToString();
                    }

                    xDocument.Save(NOM_FICHIER_XML);

                    base.Sauvegarder();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors de la sauvegarde de la devise; " + e.Message,"Attention",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
            }
        }

        public override void Supprimer()
        {
            if (this.identifiant != 1)
            {
                bool utilisee = DictionnaireDonnees.ListeProfils.Exists(profil => profil.Devise.identifiant.Equals(this.identifiant));

                if (!utilisee)
                {
                    if (!this.EstNouveau)
                    {
                        try
                        {
                            XDocument xDocument = XDocument.Load(NOM_FICHIER_XML);
                            IEnumerable<XElement> devises = xDocument.Elements();
                            XElement elementDevise = (from devise in devises.Elements()
                                                      where devise.Element("identifiant").Value.Equals(this.identifiant.ToString())
                                                      select devise).First();
                            elementDevise.Remove();
                            xDocument.Save(NOM_FICHIER_XML);
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show("Une erreur est survenue lors de la suppression de la devise; " + e.Message, "Attention", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                    DictionnaireDonnees.ListeDevises.Remove(this);

                    this.Dispose();
                }
                else 
                {
                    MessageBox.Show("Cette devise ne peut être supprimée car elle est utilisé par un ou plusieurs profils!", "Avertissement", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            else
            {
                MessageBox.Show("Impossible de supprimer la devise canadienne puisque les autres devises se base sur celle-ci.","Avertissement",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
            }
        }
    }
}
